﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using Beeldbankmvc.ViewModels;

namespace Beeldbankmvc.Models
{
    public class PublishRightsRepository
    {
        BeeldbankLinqDataContext db = new BeeldbankLinqDataContext();

        public IEnumerable<PublishRightsModel> getPublishRights()
        {
            return from o in FindAll()
                select new PublishRightsModel
                {
                    Id = o.Id,
                    Beheerder = o.Beheer.ToString(),
                    EindRedacteur = o.Redacteur.ToString(),
                    BeheerderName = o.aspnet_User1.UserName,
                    EindRedacteurName = o.aspnet_User.UserName,
                };
        }

        public PublishRightsModel FindOne(int id)
        {
            PublishRightsModel publishRightsModel = new PublishRightsModel();

            BEELDBANK_REDACTEUR_BEHEER theOne = FindAll().Where(p => p.Id == id).First();

            publishRightsModel.Beheerder = theOne.Beheer.ToString();
            publishRightsModel.EindRedacteur = theOne.Redacteur.ToString();
            publishRightsModel.Id = theOne.Id;
            publishRightsModel.BeheerderName = theOne.aspnet_User1.UserName;
            publishRightsModel.EindRedacteurName = theOne.aspnet_User.UserName;

            return publishRightsModel;
        }

        public void Create(PublishRightsModel publishRightsModel)
        {
            Guid BeheerderGuid = new Guid(publishRightsModel.Beheerder);
            Guid EindRedacteurGuid = new Guid(publishRightsModel.EindRedacteur);

            BEELDBANK_REDACTEUR_BEHEER theOne = new BEELDBANK_REDACTEUR_BEHEER();
            theOne.Id = publishRightsModel.Id;

            // 
            // Important:   Update the relation, not the GUID value in the table fields
            //              http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/
            //
            theOne.aspnet_User1 = db.aspnet_Users.Single(c => c.UserId == BeheerderGuid);
            theOne.aspnet_User = db.aspnet_Users.Single(c => c.UserId == EindRedacteurGuid);

            db.BEELDBANK_REDACTEUR_BEHEERs.InsertOnSubmit(theOne);
        }

        public void Update(PublishRightsModel publishRightsModel)
        {
            Guid BeheerderGuid = new Guid(publishRightsModel.Beheerder);
            Guid EindRedacteurGuid = new Guid(publishRightsModel.EindRedacteur);

            BEELDBANK_REDACTEUR_BEHEER theOne = FindAll().Where(p => p.Id == publishRightsModel.Id).First();
            theOne.Id = publishRightsModel.Id;

            // 
            // Important:   Update the relation, not the GUID value in the table fields
            //              http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/
            //
            theOne.aspnet_User1 = db.aspnet_Users.Single(c => c.UserId == BeheerderGuid);
            theOne.aspnet_User = db.aspnet_Users.Single(c => c.UserId == EindRedacteurGuid);
        }

        public void Delete(int id)
        {
            BEELDBANK_REDACTEUR_BEHEER theOne = FindAll().Where(p => p.Id == id).First();

            db.BEELDBANK_REDACTEUR_BEHEERs.DeleteOnSubmit(theOne);
        }

        public IEnumerable<BeheerUserModel> getRedactieUserList()
        {
            var users = from u in FindAllUsers()
                        select new BeheerUserModel
                        {
                            userId = u.UserId.ToString(),
                            name = u.UserName,
                        };
            // Order list by name
            users = users.Distinct().OrderBy(u => u.name);

            List<BeheerUserModel> redactieUserList = new List<BeheerUserModel>();

            foreach (BeheerUserModel currentUser in users)
            {
                if (Roles.IsUserInRole(currentUser.name, "Beheerder") || Roles.IsUserInRole(currentUser.name, "EindRedacteur"))
                {
                    redactieUserList.Add(currentUser);
                }
            }

            return redactieUserList;
        }

        public IEnumerable<BeheerUserModel> getBeheerUserList()
        {
            var users = from u in FindAllUsers()
                        select new BeheerUserModel
                        {
                            userId = u.UserId.ToString(),
                            name = u.UserName,
                        };
            // Order list by name
            users = users.Distinct().OrderBy(u => u.name);

            List<BeheerUserModel> beheerderUserList = new List<BeheerUserModel>();

            foreach (BeheerUserModel currentUser in users)
            {
                if (Roles.IsUserInRole(currentUser.name, "Beheerder"))
                {
                    beheerderUserList.Add(currentUser);
                }
            }

            return beheerderUserList;
        }

        public IEnumerable<EindRedacteurUserModel> getEindRedacteurUserList()
        {
            var users = from u in FindAllUsers()
                select new EindRedacteurUserModel
                {
                    userId = u.UserId.ToString(),
                    name = u.UserName,
                };
            // Order list by name
            users = users.Distinct().OrderBy(u => u.name);

            List<EindRedacteurUserModel> eindredacteurUserList = new List<EindRedacteurUserModel>();

            foreach (EindRedacteurUserModel currentUser in users)
            {
                if (Roles.IsUserInRole(currentUser.name, "EindRedacteur"))
                {
                    eindredacteurUserList.Add(currentUser);
                }
            }

            return eindredacteurUserList;
        }

        public IList<SelectListItem> testList()
        {
            IList<SelectListItem> itemList = new List<SelectListItem>();
            itemList.Add(new SelectListItem { Text = "Vraag", Value = "1" });
            itemList.Add(new SelectListItem { Text = "Probleem", Value = "2" });
            itemList.Add(new SelectListItem { Text = "Suggestie", Value = "3" });
            itemList.Add(new SelectListItem { Text = "Klacht", Value = "4" });
            return itemList;
        }

        public IQueryable<BEELDBANK_REDACTEUR_BEHEER> FindAll()
        {
            return db.BEELDBANK_REDACTEUR_BEHEERs;
        }

        public IQueryable<aspnet_User> FindAllUsers()
        {
            return db.aspnet_Users.OrderBy(u => u.UserName);
        }

        public void Save()
        {
            db.SubmitChanges();
        }

    }

}